var express = require('express');
var router = express.Router();
const user = require("../sql/user")
const sql = require("../sql")
const tools = require("../tools")
const uuid = require("node-uuid")
const md5 = require('md5')
const jwt = require("jsonwebtoken");

/**
* @apiGroup 用户信息
* @api {get} /api/user/sendsms 发送短信验证码
* @apiVersion 0.0.0
* @apiDescription 根据手机号发送短信验证码
* @apiParam {String} tel 手机号
* @apiSuccess {Number} code 请求状态，0为请求失败，1为请求成功，2为不想给你
* @apiSuccess {String} title 请求说明
* @apiSuccess {Array} msg 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"请求成功",
*    "data":[{},{},...]
* }
* @apiSampleRequest http://1.15.180.181:3000/api/user/sendsms
*/

// 接口功能路由
router.get('/sendsms', function (req, res, next) {
    // 接收手机号
    const tel = req.query.tel
    // 生成验证码
    const code = tools.randomnumber(4);
    // 先根据手机号从数据库中读取数据
    sql.get({
        colName: user,
        where: { tel }
    }).then(data => {
        if (data.length < 1) {
            // 首次发送短信验证码
            tools.sendSMS(tel, code).then(s => {
                // 短信是否发送成功
                if (s.SendStatusSet[0].Code === "Ok") {
                    // 将手机号和验证码存到数据库
                    sql.add(user, { tel, code }).then(() => {
                        res.send({
                            code: 0,
                            title: "首次发送短信验证码成功",
                            data: code
                        })
                    })
                } else {
                    // 短信发送失败
                    res.send({
                        code: 3,
                        title: s.SendStatusSet[0].Message,
                        data: null
                    })
                }
            })
        } else if (data[0].username && data[0].password) {
            // 该手机号已被注册，不能再次注册
            res.send({
                code: 1,
                title: "该手机号已被注册，不能发送注册短信验证码",
                data: code
            })
        } else {
            // 再次发送短信验证码
            tools.sendSMS(tel, code).then(s => {
                // 短信是否发送成功
                if (s.SendStatusSet[0].Code === "Ok") {
                    // 更新数据库中的验证码
                    sql.set(user, { tel }, { code }).then(() => {
                        res.send({
                            code: 2,
                            title: "重新发送短信验证码成功",
                            data: code
                        })
                    })
                } else {
                    // 发送失败
                    res.send({
                        code: 3,
                        title: s.SendStatusSet[0].Message,
                        data: null
                    })
                }
            })
        }
    })
});

/**
* @apiGroup 用户信息
* @api {post} /api/user/register 注册
* @apiVersion 0.0.0
* @apiDescription 注册，注册之前一定要先获取验证码
* @apiParam {String} tel 手机号
* @apiParam {String} username 用户名
* @apiParam {String} password 密码
* @apiParam {String} code 验证码
* @apiSuccess {Number} code 请求状态，0为请求失败，1为请求成功，2为不想给你
* @apiSuccess {String} title 请求说明
* @apiSuccess {Array} msg 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"请求成功",
*    "data":[{},{},...]
* }
* @apiSampleRequest http://1.15.180.181:3000/api/user/register
*/
router.post("/register", (req, res, next) => {
    const tel = req.body.tel;
    const code = req.body.code;
    const un = req.body.username;
    const pw = req.body.password;

    // 1. 根据手机号读取数据库信息
    sql.get({
        colName: user,
        where: { tel }
    }).then(telData => {
        if (telData.length < 1) {
            // 2. 没读到，提示先发送验证码
            res.send({
                code: 0,
                title: "请先发送验证码",
                data: null
            })
        } else if (telData[0].username) {
            // 3. 读到了，判断是否存在用户名，存在用户名，该手机号已被注册
            res.send({
                code: 1,
                title: "该手机号已被注册",
                data: null
            })
        } else if (telData[0].code !== code) {
            // 4. 不存在用户名，手机号可以注册，再验证验证码是否正确
            res.send({
                code: 2,
                title: "验证码不对",
                data: null
            })
        } else {
            // 5. 不存在用户名，手机号可以注册，验证码正确，根据本次用户名查询数据
            sql.get({
                colName: user,
                where: { username: un }
            }).then(userData => {
                if (userData.length > 0) {
                    // 6. 查到了，用户名重复
                    res.send({
                        code: 3,
                        title: "用户名重复",
                        data: null
                    })
                } else {
                    // 7. 没查到，可以注册
                    const token = jwt.sign({
                        caidan: "hahaha"
                    }, "千锋", {
                        expiresIn: 60 * 60 * 24 * 7
                    });

                    sql.set(user, { tel }, {
                        username: un,
                        password: md5(pw),
                        userId: "user-" + uuid.v1(),
                        token: token
                    }).then(() => {
                        res.send({
                            code: 4,
                            title: "注册成功，其实不需要返回数据，为了测试，返回用户信息，上线之前要删除",
                            data: {
                                username: un,
                                password: md5(pw),
                                userId: "user-" + uuid.v1(),
                                token
                            }
                        })
                    })
                }
            })
        }
    })
})


/**
* @apiGroup 用户信息
* @api {post} /api/user/login 登录
* @apiVersion 0.0.0
* @apiDescription 登录，手机号或用户名 + 密码即可登录
* @apiParam {String} tel 手机号
* @apiParam {String} username 用户名
* @apiParam {String} password 密码
* @apiSuccess {Number} code 请求状态，0为请求失败，1为请求成功，2为不想给你
* @apiSuccess {String} title 请求说明
* @apiSuccess {Array} msg 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"请求成功",
*    "data":[{},{},...]
* }
* @apiSampleRequest http://1.15.180.181:3000/api/user/login
*/
router.post("/login", (req, res, next) => {
    const tel = req.body.tel || "";
    const un = req.body.username || "";
    const pw = req.body.password;

    sql.get({
        colName: user,
        where: {
            $or: [{ username: un }, { tel: tel }]
        }
    }).then(data => {
        if (data.length < 1) {
            res.send({
                code: 0,
                title: "用户名或手机号不存在",
                data: null
            })
        } else if (data[0].password === md5(pw)) {
            // 3. token技术 - 前后端分离的项目应用
            // - 后端生成后端解析
            // - 前端存储
            // 生成令牌：第三方工具：jsonwebtoken，简称jwt
            // 在令牌中存储信息
            const token = jwt.sign({
                userId: data[0].userId,
                username: data[0].username,
                caidan: "hahaha"
            }, "千锋", {
                expiresIn: 60 * 60 * 24 * 7
            });
            // 将令牌发给前端
            sql.set(user, { username: un }, { token: token }).then(() => {
                res.send({
                    code: 1,
                    title: "登录成功",
                    data: token
                })
            })
        } else {
            res.send({
                code: 2,
                title: "密码不符",
                data: null
            })
        }
    })
})


/**
* @apiGroup 用户信息
* @api {post} /api/user/get 获取个人信息
* @apiVersion 0.0.0
* @apiDescription 获取个人信息
* @apiParam {String} token 登录成功后的token
* @apiSuccess {Number} code 请求状态，0为请求失败，1为请求成功，2为不想给你
* @apiSuccess {String} title 请求说明
* @apiSuccess {Array} msg 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"请求成功",
*    "data":[{},{},...]
* }
* @apiSampleRequest http://1.15.180.181:3000/api/user/get
*/
// 获取个人信息
router.get("/get", (req, res, next) => {
    const token = req.query.token;
    // 解析token，验证token是否是上次登录成功后，后端颁发
    jwt.verify(token, "千锋", (err, jwtData) => {
        if (err) {
            res.send({
                code: 0,
                title: "token解析失败，登录失效，请重新登录"
            })
        } else {
            sql.get({
                colName: user,
                where: { token: token }
            }).then(data => {
                res.send({
                    code: 0,
                    title: "个人信息获取成功",
                    data: data,
                    token: jwtData
                })
            })
        }
    })
})





module.exports = router